package com.hxy.network.core.netty.server;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

/**
 * @description: netty 服务端业务处理器 如果不加@ChannelHandler.Sharable注解，在重连服务端的时候绑定处理器就需要 new ServerHandler(),不能是单例
 * @program: component_code_integration
 * @author: HCY
 * @create: 2022/12/07 14:42
 */
@ChannelHandler.Sharable
@Component
@Slf4j
public class ServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 将当前客户端连接存入map,实现控制设备下发 参数
     */
    public  static Map<String, ChannelHandlerContext> map = new HashMap<String, ChannelHandlerContext>();


    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        System.out.println("有客户端连接上");
    }

    /**
     * 获取数据
     * @param ctx 上下文
     * @param msg 获取的数据
     * @throws UnsupportedEncodingException
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws UnsupportedEncodingException {
        // TextWebSocketFrame t = new TextWebSocketFrame(); 用于websocket通信
        // msg为接收到的客户端传递的数据   个人这边直接传的json 数据
        ByteBuf readMessage= (ByteBuf) msg;
        // 获取客户端的请求地址,取到的值为客户端的 ip+端口号
        String url = ctx.channel().remoteAddress().toString();
        log.info("netty服务端接收到来自客户端url：{},的数据:{}",url,readMessage.toString(CharsetUtil.UTF_8));
        // 将当前的设备ip+端口存进map，当做下发设备的标识的key
        if(map.get(url) == null){
            map.put(url, ctx);
        }
        // 返回消息，证明收到了
        // 设备请求的服务器端的地址 ,用作监听设备请求的那个端口
        String servicePort = ctx.channel().localAddress().toString();
        String rmsg  = "11 02 00 C4 00 16";
        // 判断端口如果客户端请求的端口号为 9011
        if(servicePort.substring(servicePort.length() - 4, servicePort.length()).equals("9011")){
            // 业务处理
        }else{
            // 业务处理
        }
        //处理返回的信息
        ByteBuf message= Unpooled.copiedBuffer(rmsg.getBytes());
        // 返回信息
        ctx.channel().writeAndFlush(message);
        //刷新缓存区
        ctx.flush();
    }
    /**
     * 发生异常
     *
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

    /**
     * 断开连接
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("####客户端断开连接####");
    }
}
